<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /**
         * 1.函数定义
         * 2.形参
         * 3.实参
         * 4.返回值
         * 5.构造函数
         * 6.原型、原型链
         * 7.闭包
         * 8.this指向
         *   8-1. call、apply、bind
         * 
         * 函数分类：
         * 1. 普通函数：this指向
         * 2. 构造函数
         * 3. 箭头函数 没有讲
         * 
         *      var f1 = ()=>{
            
                }
         */
        
        /**
         *  普通函数的this指向，只跟调用的时候调用者有关，跟在哪里定义的，在哪里调用的没关系
         *  孙冬泉.吃()  在哪里吃   吃方法在哪里定义的都没关系
         */

        // chi方法定义在 window作用域
        function chi(){
            console.log('chi this: ', this);
        }

        //chi(); // this window 因为调用者是window

        var obj = {
            ff:function(){
                chi(); // 
            },
            ff99:chi
        }
        obj.ff();
        obj.ff99();

        // 如何改变一个函数中的this指向
        /**
         * 1. 函数名.call(this指向谁, 原参数1,原参数2,.....) 
         *    (1) 函数立即执行
         *    (2) 改变函数中的this为指定的第一个参数
         * 
         */

        function study(name,time){
            console.log('name: ', name, 'time: ', time);
            console.log('study this: ', this);
        }

        study('马万佳',30);
        var obj1 = {
            name:'焦龙超'
        };
        var obj2 = {
            name:'郑向前'
        }

        study.call(obj1,'yy', 10);

        /**
         * apply 
         * 语法：函数名.apply(要改的this, [原参数1,原参数2,....])
         * 
         * (1) 函数立即执行
         * (2) 将函数中的this，改为第一个参数
         */

        study.apply(obj2,['xx',20])

        /**
         * bind 
         * 语法： 函数名.bind(要改的this, 原参数1,原参数2,.....)
         * 
         * (1) 不会立即执行函数，而是返回一个新函数，新函数的this指向已经被改变为第一个参数了
         * 
         */
        console.log('----bind-----');
        var resFn = study.bind(obj1, 'zyx',20);
        console.log('bind返回的函数', resFn);
        resFn();

    </script>
</body>
</html>